#ifndef GAMEENGINE_HPP
#define GAMEENGINE_HPP

#include <iostream>
#include <vector>

#include "ControlManager.hpp"
#include "GameDataManager.hpp"
#include "LogicEngine.hpp"
#include "Menu.hpp"
#include "RepresentationEngine.hpp"
#include "Scene.hpp"

#include "GameMenu.hpp"
#include "MainMenu.hpp"

#include "SandboxScene.hpp"
#include "Scene01.hpp"
#include "Scene02.hpp"
#include "Scene03.hpp"
#include "Scene04.hpp"
#include "Scene05.hpp"
#include "Scene06.hpp"
#include "Scene07.hpp"
#include "Scene08.hpp"
#include "Scene09.hpp"
#include "Scene10.hpp"
#include "Scene11.hpp"
#include "Scene12.hpp"
#include "Scene13.hpp"
#include "Scene14.hpp"
#include "Scene15.hpp"
#include "Scene16.hpp"

class RepresentationEngine;

class GameEngine {
private:
    ControlManager* controlManager;
    Menu* currentMenu;
    Scene* currentScene;
    int currentSceneNumber;
    GameDataManager* gameDataManager;
    LogicEngine* logicEngine;
    RepresentationEngine* representationEngine;

    void executeCommand(string id);
    Scene* loadScene(int number);

public:
    GameEngine(int argc, char** argv);
    ~GameEngine();

    void handleKey(unsigned char key);
    void handleKeyUp(unsigned char key);
    void handleMouseButtonDown(int button);
    void handleMouseButtonUp(int button);
    void handleSpecialKey(int key);
    void handleSpecialKeyUp(int key);
    void init();
    void render();
};

#endif
